<?xml version="1.0" encoding="UTF-8" ?>
  
<xsl:stylesheet version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:f="functions" exclude-result-prefixes="xs xsi f">
	<xsl:output method="text" encoding="UTF-8" indent="yes" />
	
	<xsl:template match="/root">
		<!-- Daos.java -->
		<xsl:text><![CDATA[package org.computate.model.dao;

public interface Daos {
	public ComputateDao<?> getDao(String modelName);
]]></xsl:text>
		<xsl:for-each select="model">
			<xsl:text><![CDATA[	public ]]></xsl:text>
			<xsl:value-of select="."/>
			<xsl:text><![CDATA[Dao get]]></xsl:text>
			<xsl:value-of select="."/>
			<xsl:text><![CDATA[Dao();
]]></xsl:text>
		</xsl:for-each>
		<xsl:text><![CDATA[}
]]></xsl:text>
		
		
		
		<!-- GuiceModelModule.java -->
		<xsl:result-document href="../../guice/GuiceModelModule.java">
			<xsl:text><![CDATA[package org.computate.guice;

import com.google.inject.AbstractModule;
import com.google.inject.Singleton;
import org.computate.tool.ModelTool;
import org.computate.tool.ModelToolImpl;
import org.computate.model.dao.Daos;
import org.computate.model.dao.DaosImpl;

]]></xsl:text>
			<xsl:for-each select="model">
				<xsl:text><![CDATA[import org.computate.model.dao.]]></xsl:text>
				<xsl:value-of select="."/>
				<xsl:text><![CDATA[Dao;
]]></xsl:text>
				<xsl:text><![CDATA[import org.computate.model.dao.]]></xsl:text>
				<xsl:value-of select="."/>
				<xsl:text><![CDATA[DaoImpl;
]]></xsl:text>
			</xsl:for-each>
			<xsl:text><![CDATA[
public class GuiceModelModule extends AbstractModule {

	@Override
	protected void configure() {
		
		bind(ModelTool.class).to(ModelToolImpl.class);
		bind(Daos.class).to(DaosImpl.class);
		
]]></xsl:text>
			<xsl:for-each select="model">
				<xsl:text><![CDATA[		bind(]]></xsl:text>
				<xsl:value-of select="."/>
				<xsl:text><![CDATA[Dao.class).to(]]></xsl:text>
				<xsl:value-of select="."/>
				<xsl:text><![CDATA[DaoImpl.class).in(Singleton.class);
]]></xsl:text>
			</xsl:for-each>
			<xsl:text><![CDATA[	}

}
]]></xsl:text>
		</xsl:result-document>
		
		
		
		<!-- DaosImpl.java -->
		<xsl:result-document href="DaosImpl.java">
			<xsl:text><![CDATA[package org.computate.model.dao;

import com.google.inject.Inject;

public class DaosImpl implements Daos {

]]></xsl:text>
			<xsl:for-each select="model">
				<xsl:text><![CDATA[	@Inject private ]]></xsl:text>
				<xsl:value-of select="."/>
				<xsl:text><![CDATA[Dao ]]></xsl:text>
				<xsl:value-of select="concat(fn:lower-case(substring(., 1, 1)), substring(., 2))"/>
				<xsl:text><![CDATA[Dao;
]]></xsl:text>
			</xsl:for-each>
			<xsl:text><![CDATA[
]]></xsl:text>
			<xsl:text><![CDATA[	public ComputateDao<?> getDao(String modelName) {
		ComputateDao<?> result = null;
		
		if(modelName != null) {
]]></xsl:text>
			<xsl:for-each select="model">
				<xsl:text><![CDATA[			]]></xsl:text>
				<xsl:if test="position() gt 1">
					<xsl:text><![CDATA[else ]]></xsl:text>
				</xsl:if>
				<xsl:text><![CDATA[if(modelName.equals("]]></xsl:text>
				<xsl:value-of select="."/>
				<xsl:text><![CDATA["))
				result = ]]></xsl:text>
				<xsl:value-of select="concat(fn:lower-case(substring(., 1, 1)), substring(., 2))"/>
				<xsl:text><![CDATA[Dao;
]]></xsl:text>
			</xsl:for-each>
			<xsl:text><![CDATA[		}
		
		return result;
	}
	
]]></xsl:text>
			<xsl:for-each select="model">
				<xsl:text><![CDATA[	public ]]></xsl:text>
				<xsl:value-of select="."/>
				<xsl:text><![CDATA[Dao get]]></xsl:text>
				<xsl:value-of select="."/>
				<xsl:text><![CDATA[Dao() {
]]></xsl:text>
				<xsl:text><![CDATA[		return ]]></xsl:text>
				<xsl:value-of select="concat(fn:lower-case(substring(., 1, 1)), substring(., 2))"/>
				<xsl:text><![CDATA[Dao;
	}

	public void set]]></xsl:text>
				<xsl:value-of select="."/>
				<xsl:text><![CDATA[Dao(]]></xsl:text>
				<xsl:value-of select="."/>
				<xsl:text><![CDATA[Dao ]]></xsl:text>
				<xsl:value-of select="concat(fn:lower-case(substring(., 1, 1)), substring(., 2))"/>
				<xsl:text><![CDATA[Dao) {
]]></xsl:text>
				<xsl:text><![CDATA[		this.]]></xsl:text>
				<xsl:value-of select="concat(fn:lower-case(substring(., 1, 1)), substring(., 2))"/>
				<xsl:text><![CDATA[Dao = ]]></xsl:text>
				<xsl:value-of select="concat(fn:lower-case(substring(., 1, 1)), substring(., 2))"/>
				<xsl:text><![CDATA[Dao;
	}

]]></xsl:text>
			</xsl:for-each>
			<xsl:text><![CDATA[}
]]></xsl:text>
		</xsl:result-document>
	</xsl:template>
</xsl:stylesheet>
